// 内置库
#include <Arduino.h>
#include <WiFi.h>

// 第三方库
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <ESPDash.h>

// 无线网络名称和密码
#define SSID "LBGUEST"
#define PASSWORD "lonelybinary"

// 作弊按钮引脚 低有效
#define BTN_CHEAT 0

// 创建网页服务器和Dashboard实例
AsyncWebServer server(80);
ESPDash dashboard(&server);

// 创建抽奖状态卡片
Card draw(&dashboard, BUTTON_CARD, "福利彩票抽奖");

// 创建抽奖号码卡片空指针
Card *num1 = nullptr;
Card *num2 = nullptr;
Card *num3 = nullptr;
Card *num4 = nullptr;
Card *num5 = nullptr;
Card *num6 = nullptr;
Card *num7 = nullptr;

// 创建抽奖号码卡片指针数组
Card *numbers[] = {num1, num2, num3, num4, num5, num6, num7};

// 抽奖号码数组 和 作弊号码数组
const uint8_t totalNumber = 7;
uint8_t winnerNumbers[totalNumber] = {0};
uint8_t cheatNumbers[totalNumber] = {40, 41, 42, 44, 63, 64, 65};

// 抽奖状态
bool drawStart = false;

// 重置抽奖
void reset()
{
    for (int i = 0; i < totalNumber; i++)
    {
        // 释放内存 删除所有的中奖数字卡片
        delete numbers[i];
        numbers[i] = nullptr;
    }

    // 重置抽奖状态
    drawStart = false;
    draw.update(false);

    // Dashboard 更新
    dashboard.sendUpdates();
}

// 抽奖按钮回调函数
void drawPress(bool value)
{
    Serial.println("Button value" + String((value) ? "true" : "false"));

    if (value)
    {
        // 如果当前按钮状态是开始抽奖状true , 则开始抽奖
        drawStart = true;

        // 更新抽奖按钮状态
        draw.update(true);
        dashboard.sendUpdates();
    }
    else if (drawStart == false)
    { // 如果当前按钮状态是false , 并且抽奖已经结束了, 那么就是reset重置抽奖
        reset();
    }
}

// 设置中奖号码
void setWinnterNumbers()
{
    for (int i = 0; i < totalNumber; i++)
    {
        if (digitalRead(BTN_CHEAT) == 0)
        {
            // 如果作弊按钮被按下, 则使用作弊号码
            winnerNumbers[i] = cheatNumbers[i];
        }
        else
        {
            // 如果作弊按钮没有被按下, 则使用随机号码 1到99
            winnerNumbers[i] = random(1, 100);
        }
    }
}

// 连接wifi
void connectWifi()
{
  /* Connect WiFi */
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASSWORD);
  if (WiFi.waitForConnectResult() != WL_CONNECTED)
  {
    Serial.printf("WiFi Failed!\n");
    return;
  }
  delay(3000);
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());
}


void setup()
{
    Serial.begin(115200);

    // 初始化作弊按钮引脚
    pinMode(BTN_CHEAT, INPUT);

    // 在宇宙的暗能量的作用下 没有任何连接的pin1 将会是初始化随机数种子
    randomSeed(analogRead(1));

    connectWifi();
    
    // draw 按钮的回掉函数 当按钮被按下时候, 会调用 drawPress 函数
    draw.attachCallback(drawPress);

    // 开始网页服务器
    server.begin();
}

void loop()
{
    // 如果抽奖开始了
    if (drawStart)
    {
        // 设置中奖号码
        setWinnterNumbers();

        for (int i = 0; i < totalNumber; i++)
        {
            // 延时1秒
            delay(1000);

            // 创建中奖号码卡片
            numbers[i] = new Card(&dashboard, STATUS_CARD, String("第" + String(i + 1) + "个号码").c_str(), "success");
            
            // 更新中奖号码卡片
            numbers[i]->update(winnerNumbers[i]);

            // Dashboard 更新
            dashboard.sendUpdates();
        }

        // 抽奖结束
        drawStart = false;
    }

    delay(50);
    
}